package es.cea.carritocompra.container;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import es.cea.carritocompra.anotaciones.ComprobarRegistro;
import es.cea.carritocompra.excepciones.RegistroException;
import es.cea.carritocompra.model.Cliente;
import es.cea.core.util.ContenedorComponentesEJBBase;

public class ContenedorComponentesEJB extends ContenedorComponentesEJBBase implements InvocationHandler {

	public static <T>T nuevoComponente(Class<T> claseDeInstancia) {
		try {
		Object instancia=claseDeInstancia.newInstance();
		ClassLoader classLoader = instancia.getClass().getClassLoader();
		Class[] interfaces = instancia.getClass().getInterfaces();
		InvocationHandler ejemploProxy = new ContenedorComponentesEJB(instancia);
		return (T) Proxy.newProxyInstance(classLoader, interfaces, ejemploProxy);
		} catch (Exception e) {
			throw new RuntimeException("error al crear un nuevo componente de tipo:"+claseDeInstancia.getSimpleName());
		}
	}

	private ContenedorComponentesEJB(Object instancia) {
		setObjetoGestionado(instancia);
	}

	public Object invoke(Object proxy, Method metodo, Object[] args) throws Throwable {

		Annotation anotacionRegistro = existeAnotacion(metodo, ComprobarRegistro.class);

		if (anotacionRegistro != null)
			if (!cliente.isRegistrado())
				throw new RegistroException();

		return metodo.invoke(getObjetoGestionado(), args);

	}

	public static Cliente cliente;

}